//
//  PLMSingleton.h
//  WisdomTheTramAPP
//
//  Created by 彭利民 on 2017/4/25.
//  Copyright © 2017年 DouJin. All rights reserved.
//

#ifndef PLMSingleton_h
#define PLMSingleton_h


#define singleton_h(name) + (instancetype)shared##name;


#if __has_feature(objc_arc) //写ARC

#define singleton_m(name)  static id _instance; \
\
+ (instancetype)shared##name{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
\
return _instance; \
}\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
});\
\
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone{ \
return _instance;\
}

#else //MRC

#define singleton_m(name)  static id _instance; \
\
+ (instancetype)shared##name{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
\
return _instance; \
}\
\
+ (instancetype)allocWithZone:(struct _NSZone *)zone{ \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
});\
\
return _instance; \
} \
\
- (id)copyWithZone:(NSZone *)zone{ \
return _instance;\
} \
\
- (oneway void)release{ \
\
} \
\
- (instancetype)retain{ \
return _instance; \
} \
\
- (NSUInteger)retainCount{ \
return 1; \
} \
\
- (instancetype)autorelease{\
return _instance;\
}

#endif


#endif /* PLMSingleton_h */
